/**
 * ACL 采用大量的冗余设计，冗余设计的字段信息有：
 * 冗余字段 ：|business_line|type_name|detail_name|resource_level|first_level|second_level|third_level|fourth_level|fifth_level
 * 修改实体 ：|     NO      |   type  |   detail  |     detail   |   detail  |   detail   |   detail  |   detail   |   detail
 * business_line 不允许修改，也不允许删除，变更只能走数据订正。
 * type_name 的变更与删除，只能操作type_name. 会同步更新 detail和binding。如果存在detail表，存在type_name，则不允许删除，需要提前在detail表中的type_name信息。
 * detail_name、resource_level、first_level、second_level、third_level、fourth_level、fifth_level的变更和删除，只能操作detail.会同步更新binding.
 * 本对象，用于包装detail_name|resource_level|first_level|second_level|third_level|fourth_level|fifth_level信息的变更。
 *
 * @author：luyl
 */
package org.web.accesscontrollist.sdk.dto.redundancy;

import lombok.Getter;
import lombok.Setter;
import org.web.accesscontrollist.sdk.dto.SaveParentDTO;
import org.web.base.domain.InsertGroup;
import org.web.base.domain.UpdateGroup;

import jakarta.validation.constraints.*;

@Setter
@Getter
@NotNull(message = "DetailRedundancyDTO 不能为空")
public class DetailRedundancyDTO extends SaveParentDTO {

    /**
     * 业务线，冗余【资源详情表】的【business_line】字段，由于其冗余且做为关联使用，一但创建，则不要轻易修改。
     */
    @NotBlank(message = "businessLine can't be blank. ")
    @Size(max = 100)
    public String getBusinessLine() {
        if (getOperatorDTO() == null) {
            return "";
        }
        return getOperatorDTO().getBusinessLine();
    }

    /**
     * 资源类型名称，指定资源的类型名称，不允许为空，在相同的业务线下，不允许重名。
     */
    @NotBlank(message = "typeName can't be blank. ",  groups = {InsertGroup.class, UpdateGroup.class})
    @Size(max = 50, groups = {InsertGroup.class, UpdateGroup.class})
    private String typeName;

    /**
     * 资源详情名称，指定准备要修改的资源详情名称。业务、资源定义、资源详情名称三者逻辑唯一。
     */
    @NotBlank(message = "oldTypeName can't be blank. ")
    @Size(max = 200)
    private String oldDetailName;

    /**
     * 资源详情名称，指定修改后的资源详情名称。业务、资源定义、资源详情名称三者逻辑唯一。
     */
    private String newDetailName;

    /**
     * 资源等级，用树状结构描述资源。
     */
    @Min(value = 0,message = "resourceLevel 的最小值是0。")
    @Max(value = 5,message = "resourceLevel 的最大值是5。")
    private Integer resourceLevel;

    /**
     * 一级，描述一级资源内容，受max_level约束，小于等于max_level不允许为空。
     */
    @Size(max = 50)
    private String firstLevel;

    /**
     * 二级，描述二级资源内容，受max_level约束，小于等于max_level不允许为空。
     */
    @Size(max = 50)
    private String secondLevel;

    /**
     * 三级，描述三级资源内容，受max_level约束，小于等于max_level不允许为空。
     */
    @Size(max = 50)
    private String thirdLevel;

    /**
     * 四级，描述四级资源内容，受max_level约束，小于等于max_level不允许为空。
     */
    @Size(max = 50)
    private String fourthLevel;

    /**
     * 五级，描述五级资源内容，受max_level约束，小于等于max_level不允许为空。
     */
    @Size(max = 50)
    private String fifthLevel;

    /**
     * 是否删除，标记是否逻辑删除，enum={Y:删除;N:不删除}
     */
    @Pattern(regexp = "^([YN])$", message = "Y:删除;N:不删除")
    @Size(max = 1)
    private String isDelete;

}
